# -*- coding: utf-8 -*-
from QNative.CLoader import CLibBinder, C_CastType
lambda: "By Zero123"
"""
    该绑定方案基于标准库ctypes实现
    优点: 直接在py定义目标函数 调用清晰 使用简单 适用于简易CPP原生交互场景
    缺点: 完全依赖py运行时类型检查及转换 跨语言的调用开销较高 在高频调用下性能远不如cpython开发

    实现原理: 通过装饰器机制重新定向函数调用逻辑 直接关联目标CPP实现, 对于静态数据类型(int/float/...) 将直接调用并返回
    对于动态数据类型(如const char*字符串)则通过回调函数返回数据 避免动态内存分配带来的内存泄漏隐患

    PS: 这是一个练手的DEMO 其实现并不完整 仅供学习与娱乐
"""

test = CLibBinder("Libs/QTestLib/out/build/x64-release/QTestLib.dll")

@test.native(returnType=C_CastType.cFloat)
def getSysTime():
    return 0.0

@test.native(returnType=C_CastType.cString)
def getLevelName():
    return ""

@test.native(returnType=C_CastType.cBool)
def isCpp():
    return False

@test.native(returnType=C_CastType.cStringArray)
def getRuntimeEntityList():
    return ["-1"]

@test.native([C_CastType.cString], C_CastType.cBool)
def hasEntity(entityId):
    return False

# bindfuncName 自定义绑定名称(符号) 可避免与内建库重名问题
@test.native([C_CastType.cStringArray], C_CastType.cStringArray, bindfuncName="sorted")
def cppSorted(strList):
    return [""]

@test.native([C_CastType.cString], C_CastType.cJson)
def getEntityNBT(entityId):
    return {}

@test.native(returnType=C_CastType.cString)
def getUTF8Str():
    return ""

# 利用py3.7+高版本类型注解机制 动态注册绑定
@test.py3AutoBinder
def sumTo(start: int, to: int, length: int) -> int:
    return 0

@test.py3AutoBinder
def getStringByteSize(a: str) -> int:
    return 0

@test.py3AutoBinder
def getSystemSoundVolume() -> int:
    return 0

@test.py3AutoBinder
def setSystemSoundVolume(a: int):
    pass

if __name__ == "__main__":
    print("获取系统时间(伪):", getSysTime())
    print("获取存档名字:", getLevelName())
    print("检查是不是CPP环境:", isCpp())
    print("获取运行时实体列表:", getRuntimeEntityList())

    print("是否存在实体1:", hasEntity("-1145"))
    print("是否存在实体2:", hasEntity("2025"))

    print("使用CPP实现的字符串排序(基于字节大小):", cppSorted(["hello world", "no wolrd", "this is python", "ttttest"]))

    print("获取指定实体NBT数据(伪):", getEntityNBT("-1234"))
    print("UTF8编码测试:", getUTF8Str())

    print("从0加到10000:", sumTo(0, 10000, 1))
    print("检查字符串字节大小:", getStringByteSize("你好, 世界"))

    print("当前系统音量:", getSystemSoundVolume())